package com.gigi.util;

import com.gigi.common.Constant;
import com.gigi.entity.UserEntity;
import com.gigi.exception.BusinessException;
import com.gigi.model.enums.ErrorCodeEnum;
import lombok.extern.slf4j.Slf4j;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.util.Objects;

/**
 * 鉴权工具类
 *
 * @author Gigi
 */
@Slf4j
public final class AuthorityUtil {

    /**
     * 获取当前登录用户（是否登录）
     * <p>
     * 一般用于搜索，查看
     *
     * @param httpServletRequest
     */
    public static UserEntity getLoginUser(HttpServletRequest httpServletRequest) {
        // 1、参数校验
        if (Objects.isNull(httpServletRequest)) {
            throw new BusinessException(ErrorCodeEnum.PARAM_ERROR);
        }
        // 2、获取登录态
        HttpSession session = httpServletRequest.getSession(false);
        if (Objects.isNull(session)) {
            log.info("currentUser: No session found.");
            throw new BusinessException(ErrorCodeEnum.NOT_LOGIN);
        }
        UserEntity user = (UserEntity) session.getAttribute(Constant.USER_LOGIN_SESSION_KEY);
        if (Objects.isNull(user)) {
            log.info("currentUser: No user found in session.");
            throw new BusinessException(ErrorCodeEnum.NOT_LOGIN);
        }
        // 3、脱敏
        user.setUserPassword(null);
        log.info("currentUser: User {} is logged in. Session ID: {}", user.getUserName(), session.getId());
        // 4、返回
        return user;
    }

    /**
     * 是否是管理员
     * <p>
     * 一般用于后台管理，专属管理员权限
     *
     * @param httpServletRequest
     */
    public static void isAdmin(HttpServletRequest httpServletRequest) {
        // 1、获取当前登录用户
        UserEntity user = getLoginUser(httpServletRequest);
        // 2、判断是否是管理员
        if (!com.gigi.enums.YesOrNoEnum.YES.getCode().equals(user.getUserRole())) {
            throw new BusinessException(ErrorCodeEnum.ACCESS_DENIED);
        }
    }

    /**
     * 是否是管理员 or 本人
     * <p>
     * 一般用于修改上的权限（前台修改本人创建的信息，后台管理员修改）
     *
     * @param httpServletRequest
     * @param targetUserId       修改内容上的用户id
     */
    public static void isAdminOrSelf(HttpServletRequest httpServletRequest, Long targetUserId) {
        // 1、获取当前登录用户
        UserEntity user = getLoginUser(httpServletRequest);
        // 2、判断是否是管理员 or 本人
        if (!com.gigi.enums.YesOrNoEnum.YES.getCode().equals(user.getUserRole()) && !user.getId().equals(targetUserId)) {
            throw new BusinessException(ErrorCodeEnum.ACCESS_DENIED);
        }
    }

    /**
     * 是否是本人
     * <p>
     * 一般用于删除，只有自己能删除
     *
     * @param httpServletRequest
     * @param targetUserId       库里数据上的用户id
     */
    public static void isSelf(HttpServletRequest httpServletRequest, Long targetUserId) {
        // 1、获取当前登录用户
        UserEntity user = getLoginUser(httpServletRequest);
        // 2、判断是否是本人
        if (!user.getId().equals(targetUserId)) {
            throw new BusinessException(ErrorCodeEnum.ACCESS_DENIED);
        }
    }

}
